-- Opdracht 1 | CURSOR /* 1. Voeg een column toe aan de table Customers genaamd cust_birth_date; 2. Voeg verschillende fictieve geboortedata toe m.b.v. een cursor; 3. Bijvoorbeeld: jaar = 200 + rechter positie cust_id maand = linker positie cust_address dag = rechter positie cust_zip */ ALTER TABLE Customers ADD cust_birth_date datetime; DECLARE DateCursor CURSOR FOR SELECT cust_id, cust_address, cust_zip FROM Customers; DECLARE @cust_id CHAR(10), @cust_address CHAR(50), @cust_zip CHAR(10) OPEN DateCursor FETCH NEXT FROM DateCursor INTO @cust_id, @cust_address, @cust_zip WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @BirthDate datetime SET @BirthDate = CONVERT(datetime,'200' + RIGHT(@cust_id,1) + '/' + LEFT(@cust_address,1) + '/' +RIGHT(RTRIM(@cust_zip),1)) UPDATE Customers SET cust_birth_date = @BirthDate WHERE cust_id = @cust_id; FETCH NEXT FROM DateCursor INTO @cust_id, @cust_address, @cust_zip END CLOSE DateCursor; DEALLOCATE DateCursor; -- Opdracht 2 | FUNCTION /* 1. Maak een functie die de leeftijd berekend a.d.h.v. een geboortedatum; 2. Toon alle customers inclusief de leeftijd. */ CREATE FUNCTION Age (@BirthDate datetime) RETURNS int AS BEGIN DECLARE @Output NUMERIC SET @Output = DATEDIFF(YEAR, @BirthDate, GETDATE()) RETURN @Output END SELECT *, DBO.Age(cust_birth_date) FROM Customers; -- Opdracht 3 | TRIGGER /* 1. Bij aankoop van meer dan 50 producten wordt standaard 10% korting verleend. Maak een trigger. 2. Gebruik de stored procedure FirstOrder (H19 Antwoord 4) om te testen! */ CREATE TRIGGER update_price ON OrderItems FOR INSERT, UPDATE AS UPDATE OrderItems SET item_price = inserted.item_price * 0.9 FROM inserted WHERE OrderItems.order_num = inserted.order_num AND OrderItems.quantity > 50; Execute FirstOrder 'Nieuwe klant', 75; -- Opdracht 4 | TRANSACTION /* Pas de FirstOrder (H19 Antwoord 4) stored procedure zodanig aan dat alles of niets wordt ingevoegd. */ ALTER PROCEDURE FirstOrder @cust_name char(50), @quantity int AS BEGIN TRY BEGIN TRAN DECLARE @prod_id char(10) DECLARE @cust_id char(10) DECLARE @order_num int DECLARE @item_price decimal(8,2) SET @prod_id = 'BR02' -- Customers SELECT @cust_id=max(cust_id) FROM Customers SELECT @cust_id=@cust_id+1 INSERT INTO Customers (cust_id, cust_name) VALUES(@cust_id, @cust_name) -- Orders SELECT @order_num=max(order_num) FROM Orders SELECT @order_num=@order_num+1 INSERT INTO Orders (order_num, order_date, cust_id) VALUES(@order_num,GETDATE(),@cust_id) -- OrderItems SELECT @item_price = prod_price FROM Products WHERE prod_id=@prod_id INSERT INTO OrderItems (order_num, order_item, prod_id, quantity, item_price) VALUES(@order_num,1, @prod_id,@quantity,@item_price); COMMIT TRAN END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN PRINT ERROR_MESSAGE() END CATCH Execute FirstOrder 'Nieuwe klant', 75;